<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

</body>
<script>
  /* 连续重复最多的字符串 */
  // let str = 'aabbbbccccddddbbbb';

  // function getMaxStr (str) {
  //   let i = 0, j = 0, num = 0, resSet = new Set(str[i]);
  //   while (i < str.length) {
  //     if (str[i] !== str[j]) {
  //       if (j - i > num) {
  //         num = j - i;
  //         resSet.clear();
  //         resSet.add(str[i]);
  //       } else if (j - i == num) {
  //         resSet.add(str[i]);
  //       }
  //       i = j;
  //     }
  //     j++;
  //   }
  //   return resSet;
  // }

  // console.log(getMaxStr(str));

  /* 菲波那切数列 */
  // let cache = {};
  // function fib (n) {
  //   if (cache.hasOwnProperty(n)) {
  //     console.log('缓存中获取');
  //     return cache[n];
  //   }
  //   let res = n <= 1 ? n : fib(n - 1) + fib(n - 2);
  //   cache[n] = res;
  //   console.log('循环次数', n);
  //   return res
  // }
  // console.log(fib(10));



  /* 递归题 */
  // const arr = [1, 2, [3, [4, 5], 6], 7, [8], 9];

  // function flat (arr) {
  //   let res = [];
  //   for (let i = 0; i < arr.length; i++) {
  //     if (Array.isArray(arr[i])) {
  //       res.push({ children: flat(arr[i]) })
  //     } else {
  //       res.push({ value: arr[i] })
  //     }
  //   }
  //   return res
  // }
  // console.log(flat(arr));

  // function convert (arr) {
  //   let result = [];
  //   for (let i = 0; i < arr.length; i++) {
  //     if (Array.isArray(arr[i])) {
  //       result.push({ children: convert(arr[i]) });
  //     } else {
  //       result.push({
  //         value: arr[i]
  //       });
  //     }
  //   }
  //   return result;
  // }
  // console.log(convert(arr));

  /* 编写”智能重复“smartRepeat函数 */
  /* 返回结果 aaaaaabbccbbccbbccbbccaaaaaabbccbbccbbccbbcc */
  // let str = '2[3[aa]4[2[b]2[c]]]';
  let str = '3[2[a]2[b]]';
  // function smartRepeat (templateStr) {
  //   let stackNum = [],
  //     stackStr = [],
  //     result = '',
  //     i = 0;
  //   let rest = templateStr;
  //   while (i < templateStr.length - 1) {
  //     rest = templateStr.substring(i);
  //     // console.log(rest);
  //     if (/^\d+\[/.test(rest)) {
  //       const num = +rest.match(/^(\d+)\[/)[1];
  //       // console.log(num.toString().length + 1);
  //       // /* 加1是[的值 */
  //       i += num.toString().length + 1;
  //       stackNum.push(num);
  //       stackStr.push('');
  //     } else if (/^\w+\]/.test(rest)) {
  //       const str1 = rest.match(/^(\w+)\]/)[1];
  //       stackStr[stackStr.length - 1] += str1;
  //       i += str1.length;
  //     } else if (rest[0] === ']') {
  //       i++;
  //       const str = stackStr.pop();
  //       let num = +stackNum.pop();
  //       stackStr[stackStr.length - 1] += str.repeat(num);
  //     }
  //   }
  //   console.log(stackNum, stackStr);
  //   const str = stackStr.pop();
  //   let num = +stackNum.pop();
  //   return str.repeat(num);
  // }

  function smartRepeat (templateStr) {
    let stack = [],
      result = '',
      i = 0;
    let rest = templateStr;
    /* 匹配数字和[，并以数字开头 */
    const regExp1 = /^(\d+)\[/;
    /* 匹配字母和]，并以字母开头 */
    const regExp2 = /^(\w+)\]/;
    while (i < templateStr.length - 1) {
      rest = templateStr.substring(i);
      // console.log(rest);
      if (regExp1.test(rest)) {
        const num = +rest.match(regExp1)[1];
        // /* 跳过一些遍历。加1是[长度的值 */
        i += num.toString().length + 1;
        stack.push({
          num,
          str: ''
        });
      } else if (regExp2.test(rest)) {
        const str1 = rest.match(regExp2)[1];
        stack[stack.length - 1].str += str1;
        /* 跳过一些遍历 */
        i += str1.length;
      } else if (rest[0] === ']') {
        i++;
        const { str, num } = stack.pop();
        stack[stack.length - 1].str += str.repeat(num);
      }
    }
    console.log(stack);
    const { str, num } = stack.pop();
    return str.repeat(num);
  }
  console.log(smartRepeat(str));
  // console.log(smartRepeat2(str));
</script>

</html>